/**
 *
 * @FilePath     : agv_dto.h
 * @Version      : 1.0
 * @Description  : AGV数据传输对象定义 - 用于跨层数据传递
 *
 * @Author       : Claude Code
 * @Date         : 2025-01-23 00:00:00
 */
#pragma once

#include <QString>
#include <QStringList>
#include <QDateTime>
#include <QList>
#include <QJsonArray>
#include <QJsonObject>

namespace kernel {

// 前向声明 AGV 类型枚举
namespace agv {
    enum class AgvType;
}

namespace dtos {

/**
 * @brief 错误信息DTO
 */
struct ErrorInfoDTO {
    QString code;       // 错误代码
    QString message;    // 错误消息
};

/**
 * @brief DI/DO传感器数据
 */
struct SensorIO {
    int id;                     // ID号
    QString source;             // 来源: "normal", "virtual", "modbus"
    bool status;                // 状态: true=高电平, false=低电平
    bool valid;                 // 是否启用
};

/**
 * @brief MKLM AGV状态DTO（设备层 → 应用层）
 * @details 从MKLM协议解析的数据，用于更新AgvEntity
 */
struct MklmAgvStatusDTO {
    // ========== 基本信息 ==========
    int agvNumber;              // AGV编号 (agv_num)
    QString ip;                 // IP地址（本地字段，从连接信息获取）

    // ========== 位置信息 ==========
    double x;                   // X坐标，单位m
    double y;                   // Y坐标，单位m
    double angle;               // 角度，单位rad
    double confidence;          // 定位置信度 [0, 1]

    // ========== 站点信息 ==========
    QString currentStation;     // 当前站点ID (current_station)
    QString lastStation;        // 上一个站点ID (last_station)
    QString targetId;           // 目标站点ID (target_id)
    QString currentMap;         // 当前地图名 (current_map)
    QStringList areaIds;        // 所在区域ID数组 (area_ids)

    // ========== 状态信息 ==========
    int power;                  // 电量百分比 (power)
    bool chargeState;           // 充电状态 (charge_state)
    bool locked;                // 锁定状态 (locked)
    bool blocked;               // 阻挡状态 (blocked)
    bool driverEmc;             // 电机驱动急停 (driver_emc)
    int mode;                   // 机器人运行模式: 0=手动, 1=自动 (mode)
    bool rollerMode;            // 滚筒运行模式 (roller_mode)
    int liftStage;              // 顶升阶段 (lift_stage)

    // ========== 任务信息 ==========
    int taskStatus;             // 任务状态: 0=NONE, 2=RUNNING, 3=SUSPENDED, 4=COMPLETED, 5=FAILED, 6=CANCELED
    int taskType;               // 导航类型: 0=无导航, 1=自由导航任意点, 2=自由导航到站点, 3=路径导航到站点, 7=平动转动, 100=其他
    int taskListCount;          // 任务列表数量 (task_list_cnt)
    QStringList finishedPath;   // 已完成路径 (finished_path)
    QStringList unfinishedPath; // 未完成路径 (unfinished_path)

    // ========== API信息 ==========
    int retCode;                // API错误码 (ret_code)
    QString createOn;           // API上传时间戳 (create_on)
    QString errMsg;             // 错误信息 (err_msg)
    QDateTime uploadTime;       // 数据上传时间（本地字段）

    MklmAgvStatusDTO()
        : agvNumber(0)
        , x(0.0), y(0.0), angle(0.0)
        , confidence(0.0)
        , power(0)
        , chargeState(false)
        , locked(false)
        , blocked(false)
        , driverEmc(false)
        , mode(0)
        , rollerMode(false)
        , liftStage(0)
        , taskStatus(0)
        , taskType(0)
        , taskListCount(0)
        , retCode(0)
    {}
};

/**
 * @brief SEER AGV状态DTO（设备层 → 应用层）
 * @details 从Robokit协议解析的完整原始数据，用于更新AgvEntity
 */
struct AgvStatusDTO {
    // ========== 基本信息 ==========
    int agvNumber;              // AGV编号（本地字段，非协议）
    QString ip;                 // IP地址（本地字段，非协议）

    // ========== 运行模式和位置 ==========
    int mode;                   // 机器人运行模式: 0=手动, 1=自动
    double x;                   // X坐标，单位m
    double y;                   // Y坐标，单位m
    double angle;               // 角度，单位rad
    double confidence;          // 定位置信度 [0, 1]
    QString currentStation;     // 当前站点ID
    QString lastStation;        // 上一个站点ID

    //  ========== 电池信息 ==========
    double batteryLevel;     // 电池电量 [0, 1]
    bool charging;         // 是否充电

    //  ========== 地图信息 ==========
    QString current_map;
    // ========== 速度信息 ==========
    double vx;                  // 机器人坐标系X方向实际速度，单位m/s
    double vy;                  // 机器人坐标系Y方向实际速度，单位m/s
    double w;                   // 实际角速度，单位rad/s
    double steer;               // 单舵轮当前角度，单位rad
    double spin;                // 托盘角度，单位rad

    // ========== 阻挡和减速 ==========
    bool isStop;                // 底盘是否静止
    bool blocked;               // 是否被阻挡
    int blockReason;            // 阻挡原因: 0=超声, 1=激光, 2=防跌落, 3=碰撞, 4=红外, 5=锁车, 6=动态障碍物, 7=虚拟激光, 8=3D相机

    // ========== 区域和路径 ==========
    QStringList areaIds;        // 所在区域ID数组
    QJsonArray path;            // 规划路径点数据

    // ========== 急停和传感器 ==========
    bool emergency;             // 急停按钮是否激活: true=按下, false=拔起
    bool driverEmc;             // 电机驱动器是否急停
    QList<SensorIO> digitalInputs;   // DI数据
    QList<SensorIO> digitalOutputs;  // DO数据

    // ========== 姿态信息 ==========
    double yaw;                 // 偏航角，单位rad
    double roll;                // 滚转角，单位rad
    double pitch;               // 俯仰角，单位rad

    // ========== 任务信息 ==========
    int taskStatus;             // 任务状态: 0=NONE, 2=RUNNING, 3=SUSPENDED, 4=COMPLETED, 5=FAILED, 6=CANCELED
    int taskType;               // 导航类型: 0=无导航, 1=自由导航任意点, 2=自由导航站点, 3=路径导航站点, 7=平动转动, 100=其他
    QString targetId;           // 当前导航目标站点
    QJsonArray targetPoint;     // 目标坐标点[x, y, r]
    QStringList unfinishedPath; // 未完成路径站点数组
    QStringList finishedPath;   // 已完成路径站点数组（本地字段）

    // ========== 地图信息 ==========

    AgvStatusDTO()
        : agvNumber(0)
        , mode(0)
        , x(0.0), y(0.0), angle(0.0)
        , confidence(0.0)
        , batteryLevel(0.0), charging(false)
        , vx(0.0), vy(0.0), w(0.0)
        , steer(0.0), spin(0.0)
        , isStop(false)
        , blocked(false), blockReason(0)
        , emergency(false), driverEmc(false)
        , yaw(0.0), roll(0.0), pitch(0.0)
        , taskStatus(0), taskType(0)
    {}
};

/**
 * @brief AGV展示信息DTO（应用层 → 表现层）
 * @details 用于UI展示的简化数据，包含业务逻辑处理后的信息
 */
struct AgvInfoDTO {
    // 基本信息
    int agvNumber;              // 车辆编号
    QString name;               // 显示名称（如 "AGV001"）
    QString ip;                 // IP地址
    int type;                   // AGV类型（对应 AgvType 枚举）

    // 位置信息
    double x;                   // X坐标（米）
    double y;                   // Y坐标（米）
    double angle;               // 角度（弧度）
    QString currentStation;     // 当前站点（如 "LM001"）
    QString lastStation;        // 上一个站点
    QString targetStation;      // 目标站点
    QString currentMap;         // 当前地图名
    QStringList areaIds;        // 所在区域ID列表

    // 状态信息
    int power;                  // 电量（百分比 0-100）
    double confidence;          // 定位置信度（0.0-1.0）
    bool charging;              // 充电状态
    bool locked;                // 锁定状态
    bool blocked;               // 阻挡状态
    bool online;                // 在线状态
    int mode;                   // 运行模式（0=手动，1=自动）
    int liftStage;              // 顶升阶段

    // 任务信息
    int taskStatus;             // 任务状态：0=NONE, 2=RUNNING, 3=SUSPENDED, 4=COMPLETED, 5=FAILED, 6=CANCELED
    int taskType;               // 导航类型：0=无导航, 1=自由导航任意点, 2=自由导航到站点, 3=路径导航到站点, 100=其他
    int taskListCount;          // 任务列表数量
    QStringList finishedPath;   // 已完成路径
    QStringList unfinishedPath; // 未完成路径
    bool isControlledByDispatcher; // 是否受调度控制

    // 错误信息
    QList<ErrorInfoDTO> errors; // 错误列表
    QString errorMessage;       // 错误消息
    int retCode;                // API错误码

    // 时间戳
    QDateTime uploadTime;       // 上传时间
    QDateTime lastBusyTime;     // 最后忙碌时间
    QString createOn;           // API创建时间戳

    AgvInfoDTO()
        : agvNumber(0)
        , type(0)
        , x(0.0)
        , y(0.0)
        , angle(0.0)
        , power(0)
        , confidence(0.0)
        , charging(false)
        , locked(false)
        , blocked(false)
        , online(false)
        , mode(0)
        , liftStage(0)
        , taskStatus(0)
        , taskType(0)
        , taskListCount(0)
        , isControlledByDispatcher(false)
        , retCode(0)
    {}
};

/**
 * @brief AGV导航请求DTO
 * @details 用于路径规划请求
 */
struct AgvNavRequestDTO {
    int agvNumber;              // 车辆编号
    QString startStation;       // 起点站点
    QString goalStation;        // 终点站点

    AgvNavRequestDTO()
        : agvNumber(0)
    {}

    AgvNavRequestDTO(int num, const QString& start, const QString& goal)
        : agvNumber(num)
        , startStation(start)
        , goalStation(goal)
    {}
};

/**
 * @brief 任务状态枚举
 */
enum class TaskStatus {
    None = 0,           // 无任务
    Waiting = 1,        // 等待中（不常见）
    Running = 2,        // 运行中
    Suspended = 3,      // 暂停
    Completed = 4,      // 完成
    Failed = 5,         // 失败
    Canceled = 6        // 取消
};

/**
 * @brief 任务类型枚举
 */
enum class TaskType {
    None = 0,               // 无导航
    FreeNavToPoint = 1,     // 自由导航到任意点
    FreeNavToStation = 2,   // 自由导航到站点
    PathNavToStation = 3,   // 路径导航到站点
    Translation = 7,        // 平动转动
    Other = 100             // 其他
};

/**
 * @brief 运行模式枚举
 */
enum class AgvMode {
    Manual = 0,     // 手动模式
    Auto = 1        // 自动模式
};

} // namespace dtos
} // namespace kernel
